package br.com.rotary.generico;

import br.com.rotary.modelo.Usuario;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;

/**
 * Classe genérica na qual todas as entidades do projeto devem herdar, mantém o
 * controle de modificação e o versionamento
 *
 * @author laverson
 */
@MappedSuperclass
public abstract class EntidadeGenerica implements Serializable {

    /**
     * Quando false, o objeto encontra-se excluido/cancelado. Caso contrário
     * encontra-se ativo
     */
    private Boolean ativo = true;
    /**
     * Controle de versionamento da entidade, faz o controle de alterações
     * concorrentes
     */
    @Version
    private int versao;
    /**
     * Timestamp da persistencia do objeto
     */
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    private Date dataCriacao;
    /**
     * Timestamp da alteração do objeto
     */
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    private Date dataAtualizacao;
    /**
     * Usuário do sistema que persistiu o objeto
     */
    @OneToOne
    private Usuario usuarioCriacao;
    /**
     * Usuário do sistema que atualizou o objeto
     */
    @OneToOne
    private Usuario usuarioAtualizacao;

    /**
     * Construtor padrão, no qual inicializa {@link ativo} como true
     */
    public EntidadeGenerica() {
        this.ativo = true;
    }

    public Boolean getAtivo() {
        return ativo;
    }

    public void setAtivo(Boolean ativo) {
        this.ativo = ativo;
    }

    public int getVersao() {
        return versao;
    }

    public void setVersao(int versao) {
        this.versao = versao;
    }

    public Date getDataAtualizacao() {
        return dataAtualizacao;
    }

    public void setDataAtualizacao(Date dataAtualizacao) {
        this.dataAtualizacao = dataAtualizacao;
    }

    public Date getDataCriacao() {
        return dataCriacao;
    }

    public void setDataCriacao(Date dataCriacao) {
        this.dataCriacao = dataCriacao;
    }

    public Usuario getUsuarioAtualizacao() {
        return usuarioAtualizacao;
    }

    public void setUsuarioAtualizacao(Usuario usuarioAtualizacao) {
        this.usuarioAtualizacao = usuarioAtualizacao;
    }

    public Usuario getUsuarioCriacao() {
        return usuarioCriacao;
    }

    public void setUsuarioCriacao(Usuario usuarioCriacao) {
        this.usuarioCriacao = usuarioCriacao;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 97 * hash + (this.ativo != null ? this.ativo.hashCode() : 0);
        hash = 97 * hash + this.versao;
        hash = 97 * hash + (this.dataCriacao != null ? this.dataCriacao.hashCode() : 0);
        hash = 97 * hash + (this.dataAtualizacao != null ? this.dataAtualizacao.hashCode() : 0);
        hash = 97 * hash + (this.usuarioCriacao != null ? this.usuarioCriacao.hashCode() : 0);
        hash = 97 * hash + (this.usuarioAtualizacao != null ? this.usuarioAtualizacao.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final EntidadeGenerica other = (EntidadeGenerica) obj;
        if (this.ativo != other.ativo && (this.ativo == null || !this.ativo.equals(other.ativo))) {
            return false;
        }
        if (this.versao != other.versao) {
            return false;
        }
        if (this.dataCriacao != other.dataCriacao && (this.dataCriacao == null || !this.dataCriacao.equals(other.dataCriacao))) {
            return false;
        }
        if (this.dataAtualizacao != other.dataAtualizacao && (this.dataAtualizacao == null || !this.dataAtualizacao.equals(other.dataAtualizacao))) {
            return false;
        }
        if (this.usuarioCriacao != other.usuarioCriacao && (this.usuarioCriacao == null || !this.usuarioCriacao.equals(other.usuarioCriacao))) {
            return false;
        }
        if (this.usuarioAtualizacao != other.usuarioAtualizacao && (this.usuarioAtualizacao == null || !this.usuarioAtualizacao.equals(other.usuarioAtualizacao))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "EntidadeGenerica{" + "ativo=" + ativo + ", versao=" + versao + ", dataCriacao=" + dataCriacao + ", dataAtualizacao=" + dataAtualizacao + ", usuarioCriacao=" + usuarioCriacao + ", usuarioAtualizacao=" + usuarioAtualizacao + '}';
    }
}
